package com.zdwhong.mysqlms.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.zdwhong.mysqlms.multidatasource.DBTypeEnum;
import com.zdwhong.mysqlms.multidatasource.MyRoutingDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author ZDW
 * @since 2021-05-25 18:46
 * mysql读写分离，多数据源配置
 */
@Configuration
@Slf4j
public class MultiDataSourceConfig {
    /**
     * 主数据源
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
    public DataSource masterDataSource() {
        //DataSource dataSource = DataSourceBuilder.create().build();
        /**
         * 因为使用的是druid数据库连接池，所以创建数据源要使用DruidDataSourceBuilder
         * 不能像上面注释的代码那样使用 DataSourceBuilder（默认的hikaricp连接池就使用这种）
         */
        DataSource dataSource = DruidDataSourceBuilder.create().build();
        log.info("#############主数据源："+dataSource);
        return dataSource;
    }

    /**
     * 从数据源
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
    public DataSource slaveDataSource() {
        //DataSource dataSource = DataSourceBuilder.create().build();
        DataSource dataSource = DruidDataSourceBuilder.create().build();
        log.info("-------------从数据源："+dataSource);
        return dataSource;
    }

    /**
     * 路由数据源，前面两个数据源是为了创建此数据源
     * @param masterDataSource 主数据源
     * @param slaveDataSource 从数据源
     * @return
     */
    @Bean
    public DataSource myRoutingDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                          @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);
        targetDataSources.put(DBTypeEnum.SLAVE, slaveDataSource);

        MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
        myRoutingDataSource.setDefaultTargetDataSource(slaveDataSource);//设置默认数据源
        myRoutingDataSource.setTargetDataSources(targetDataSources);//设置路由表，使用map的key，value方式得到对应数据源
        return myRoutingDataSource;
    }

}
